package com.zkh.myutils.database.data.handler;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.function.Function;

import com.zkh.myutils.database.data.DBOperateUtils;
import com.zkh.myutils.database.data.tools.TypeAdapter;

/**
 * 处理数据方式，将第一行第一列数据转成指定对象后返回。适用于单行单列，如聚合函数。
 * @author zkh
 *
 */
public class ObjectHandler<T> implements Handler<T> {
	//指定目标类型
	private Class<? extends T> type;
	//指定自定义转换
	private Function<Object, T> converter;
	/**
	 * 构造器
	 */
	public ObjectHandler(){}
	/**
	 * 构造器，供特定类型转换。如果类型是标准的JDBC封装类型，则调用无参构造即可。<br/>
	 * 如数据库类型是bigint，JDBC会自动转换为Long类型，所以若以Long类型来接收数据，就可以调用无参构造器，不用指定类型
	 * @param type 要转换类型的Class属性。此处不能是基础类型，可以是基础类型的包装类型，或其它（String, Date, BigDecimal, BigInteger）
	 */
	public ObjectHandler(Class<? extends T> type){
		this.type = type;
	}
	/**
	 * 构造器，自定义类型转换逻辑
	 * @param converter 类型转换逻辑
	 */
	public ObjectHandler(Function<Object, T> converter) {
		this.converter = converter;
	}

	/**
	 * 处理数据的具体方法。
	 */
	@SuppressWarnings("unchecked")
	public T handle(ResultSet rs) throws SQLException {
		//获取数据
		Object obj = DBOperateUtils.getResult(rs);
		//存在自定义处理逻辑
		if(converter!=null) {
			return converter.apply(obj);
		}
		//存在指定类型
		if(type!=null) {
			return (T) TypeAdapter.convertType(obj, type);
		}
		//其它情况，直接转换并返回数据
		return (T) obj;
	}

}
